package com.highspeed.bdk.gateway.socket.analyze.preset.deploy.response.storage.result;


import com.highspeed.bdk.gateway.Util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.Map;

/**
 * RIO块传输逻辑链路信息回传
 */
public class LogicalLinkStatusDisplayResult {
    private Log logger = LogFactory.getLog(getClass());

    public Map<String, Object> resolve(byte[] response) {
        int offset = 0;

        /**
         * 应用消息头-源逻辑地址(2byte)
         描述信息：1=ISP1_NX模块逻辑地址。
         */
        short srcAddr = Util.getShort(response, offset);
        offset += 2;
        logger.info("应用消息头-源逻辑地址(2byte)......." + srcAddr);

        /**
         * 应用消息头-帧类型(1byte)
         枚举项：
         0=N/A；
         1=有ACK应答，有结果；
         2=有ACK应答，无结果；
         3=无ACK应答，有结果；
         4=无ACK应答，无结果；
         5=ACK/NAK帧；
         描述信息：0=N/A。
         */
        byte frameType = Util.getByte(response, offset);
        logger.info("应用消息头-帧类型(1byte)......." + frameType);
        offset++;

        /**
         * 应用消息头-消息ID(2byte)
         描述信息：8017。
         */
        short messageId = Util.getShort(response, offset);
        logger.info("应用消息头-消息ID(2byte)......." + messageId);
        offset += 2;


        /**
         * 应用消息头-消息长度_4字节(4byte)
         参数：LSB：1；
         描述：
         消息长度_4字节。
         */
        int length = Util.getInt(response, offset);
        offset += 4;
        logger.info("应用消息头-消息长度_4字节(4byte)......." + length);

        //循环1000次
        for (int i = 0; i < 1000; i++) {
            logger.info("循环第......." + i + "次");

            /**
             * 组建逻辑关系-组建链路条数(4byte)
             描述：
             此组建相关的链路条数。
             */
            int linkNum = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-组建链路条数(4byte)......." + linkNum);

            /**
             * 组建逻辑关系-应用组件ID(4byte)
             描述：
             应用组件ID，必须全域唯一。
             */
            int appId = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-应用组件ID(4byte)......." + appId);

            /**
             * 组建逻辑关系-应用组件名称(1byte*32)
             描述：
             应用组件名称，与应用组件ID一一对应，必须全域唯一。
             */

            //跳过32个字节，不清楚内容是什么
            byte[] sub = Util.getSubBytes(response, offset, 32);
            offset += 32;
            logger.info("组建逻辑关系-应用组件名称(1byte*32)......." + sub);

            /**
             * 组建逻辑关系-应用组件发送端口-应用组件名称(1byte*32)
             描述：
             应用组件名称，与应用组件ID一一对应，必须全域唯一。

             */
            //跳过32个字节，不清楚内容是什么
            sub = Util.getSubBytes(response, offset, 32);
            offset += 32;
            logger.info("组建逻辑关系-应用组件发送端口-应用组件名称(1byte*32)......." + sub);

            /**
             * 组建逻辑关系-应用组件发送端口-RIO物理地址(2byte)
             描述：
             填写RIO物理地址，0xFF表示无效的RIO物理地址。
             */
            short rioAddr = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-应用组件发送端口-RIO物理地址(2byte)......." + rioAddr);

            /**
             * 组建逻辑关系-应用组件发送端口-端口ID(2byte)
             */
            short portId = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-应用组件发送端口-端口ID(2byte)......." + portId);

            /**
             * 组建逻辑关系-应用组件发送端口-端口名称(1byte*32)
             */
            //跳过32个字节，不清楚内容是什么
            sub = Util.getSubBytes(response, offset, 32);
            offset += 32;
            logger.info("组建逻辑关系-应用组件发送端口-端口名称(1byte*32)......." + sub);

            /**
             * 组建逻辑关系-应用组件接收端口-应用组件名称(1byte*32)
             描述：
             应用组件名称，与应用组件ID一一对应，必须全域唯一。
             */
            //跳过32个字节，不清楚内容是什么
            sub = Util.getSubBytes(response, offset, 32);
            offset += 32;
            logger.info("组建逻辑关系-应用组件接收端口-应用组件名称(1byte*32)......." + sub);

            /**
             * 组建逻辑关系-应用组件接收端口-RIO物理地址(2byte)
             描述：
             填写RIO物理地址，0xFF表示无效的RIO物理地址。
             */
            rioAddr = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-应用组件接收端口-RIO物理地址(2byte)......." + rioAddr);

            /**
             * 组建逻辑关系-应用组件接收端口-端口ID(2byte)
             */
            portId = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-应用组件接收端口-端口ID(2byte)......." + portId);

            /**
             * 组建逻辑关系-应用组件接收端口-端口名称(1byte*32)
             */

            //跳过32字节，不清楚内容是什么
            sub = Util.getSubBytes(response, offset, 32);
            offset += 32;
            logger.info("组建逻辑关系-应用组件接收端口-端口名称(1byte*32)......." + sub);

            /**
             * 组建逻辑关系-传输类型(2byte)
             描述信息：0：消息传输（远轰不实现该项）；
             1：内存映射，单播；
             2：内存映射，多播。
             */
            short transferType = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-传输类型(2byte)......." + transferType);

            /**
             * 组建逻辑关系-多播地址(2byte)
             描述信息：245-253
             */
            short muiltyAddr = Util.getShort(response, offset);
            offset += 2;
            logger.info("组建逻辑关系-多播地址(2byte)......." + muiltyAddr);


            /**
             * 组建逻辑关系-DESC RIO地址(4byte)
             */
            int descRidAddr = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-DESC RIO地址(4byte)......." + descRidAddr);

            /**
             * 组建逻辑关系-DATA RIO地址(4byte)
             */
            int dataRioAddr = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-DATA RIO地址(4byte)......." + dataRioAddr);

            /**
             * 组建逻辑关系-缓冲区大小(4byte)
             */
            int buffer = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-缓冲区大小(4byte)......." + buffer);

            /**
             * 组建逻辑关系-缓冲区个数(4byte)
             */
            int bufferNum = Util.getInt(response, offset);
            offset += 4;
            logger.info("组建逻辑关系-缓冲区个数(4byte)......." + bufferNum);

            /**
             * 组建逻辑关系-是否流控(1byte)
             枚举项：
             0=NO；
             1=YES；
             */
            byte isControl = Util.getByte(response, offset);
            offset++;
            logger.info("组建逻辑关系-是否流控(1byte)......." + isControl);

            /**
             * 组建逻辑关系-是否发送数据描述(1byte)
             枚举项：
             0=NO；
             1=YES；
             */
            byte isSendDataDesc = Util.getByte(response, offset);
            offset++;
            logger.info("组建逻辑关系-是否发送数据描述(1byte)......." + isSendDataDesc);

            /**
             * 组建逻辑关系-是否提醒消息到来(1byte)
             枚举项：
             0=NO；
             1=YES；
             */
            byte isMessageOn = Util.getByte(response, offset);
            offset++;
            logger.info("组建逻辑关系-是否提醒消息到来(1byte)......." + isMessageOn);

            /**
             * 组建逻辑关系-是否可靠传输(1byte)
             枚举项：
             0=NO；
             1=YES；
             */
            byte isReliable = Util.getByte(response, offset);
            offset++;
            logger.info("组建逻辑关系-是否可靠传输(1byte)......." + isReliable);
        }

        return null;
    }
}
